/*
 * 状态模式是协议交互中使用得比较多的模式。
 *
 * 比如说，在不同的协议中，都会存在启动、保持、中止等基本状态。
 *
 * 那么怎么灵活地转变这些状态就是我们需要考虑的事情。假设现在有一个state，
 */
typedef struct state
{
	void (*process)();
	struct state * (*change_state)();
} state;

/*
 * 说明一下，这里定义了两个变量，分别process函数和change_state函数。其中proces函数就是普通的数据操作
 */

void normal_process()
{
	printf("normal process!\n");
}

/*
 * change_state函数本质上就是确定下一个状态是什么
 */
struct state * change_state()
{
	state * pnext_state = NULL;

	pnext_state = (struct state* ) malloc(sizeof(struct state));
	assert(NULL != pnext_state);

	pnext_state->process = next_process;
	pnext_state->change_state = next_change_state;
	return pnext_state;
}

/*
 * 所以，在context中，应该有一个state变量，还应该有一个state变换函数
 */
typedef struct context
{
	state * pstate;

	void (*change)(struct context * pcontext);
}context;

void context_change(struct context * pcontext)
{
	state *pre;
	assert(NULL != pcontext);

	pre = pcontext->pstate;
	pcontext->pstate = pre->change_state();
}

